classdef AffineFormOld
    %UNTITLED3 Summary of this class goes here
    %   Detailed explanation goes here
    
    properties
    form % form of affine function
    end
    
    methods
        
       function affineForm=AffineForm(value)
            if nargin==0 % Used when objects are loaded from disk
              affineForm.form=[];
              return;
            end
			 val_class=class(value);
			 if strcmp(val_class,'AffineForm')
                affineForm=value;
                return
             end
			 if strcmp(val_class,'Interval')
                 e_i=sym(value.name);
                 affineForm.form=(value.imax+value.imin)/2 + (value.imax-value.imin)/2 * e_i;
                return
             end
             if strcmp(val_class,'double')
				affineForm.form=value;
                return
             end
        end
        function r=plus(X,Y) 
			X=AffineForm(X);Y=AffineForm(Y);
            r=AffineForm();
            r.form=X.form+Y.form;
        end
        function r=minus(X,Y)
			X=AffineForm(X);Y=AffineForm(Y);
			r=AffineForm();
            r.form=X.form-Y.form;
        end
        function r=mtimes(X,Y)
			X=AffineForm(X);Y=AffineForm(Y);
            r=AffineForm();
            r.form=X.form*Y.form;
             
        end
        function r=mrdivide(X,Y)
			X=AffineForm(X);Y=AffineForm(Y);
            r=AffineForm();
            r.form=X.form/Y.form;
        end
        
        function r=max(X,Y)
		  X=AffineForm(X);Y=AffineForm(Y);
          iX=X.convertToInterval('first'); 
 		  iY=Y.convertToInterval('second');
		  iMax=max(iX,iY);
		  if strcmp(iMax.name,iX.name)
			r=X;
			return
		  end
		  if strcmp(iMax.name,iY.name)
			r=Y;
			return
		  end
		  r=AffineForm(iMax);
        end
		
        function r=min(X,Y)
		  X=AffineForm(X);Y=AffineForm(Y);
          iX=X.convertToInterval('first'); 
 		  iY=Y.convertToInterval('second');
		  iMax=min(iX,iY);
		  if strcmp(iMax.name,iX.name)
			r=X;
			return
		  end
		  if strcmp(iMax.name,iY.name)
			r=Y;
			return
		  end
		  r=AffineForm(iMax);
         end
		 
		 
		 
		 function C=lt(X,Y)
		   X=AffineForm(X);Y=AffineForm(Y);
           iX=X.convertToInterval('first'); %% имена должны содержать переменные?
 		   iY=Y.convertToInterval('second'); 
		   C=lt(iX,iY);
         end
         
         function C=gt(X,Y)
		    X=AffineForm(X);Y=AffineForm(Y);
            iX=X.convertToInterval('first'); %% имена должны содержать переменные?
 		    iY=Y.convertToInterval('second'); 
		    C=gt(iX,iY); 
         end
         
         function C=le(X,Y)
		    X=AffineForm(X);Y=AffineForm(Y);
            iX=X.convertToInterval('first'); %% имена должны содержать переменные?
 		    iY=Y.convertToInterval('second'); 
		    C=le(iX,iY); 
         end
         
         function C=ge(X,Y)
		    X=AffineForm(X);Y=AffineForm(Y);
            iX=X.convertToInterval('first'); %% имена должны содержать переменные?
 		    iY=Y.convertToInterval('second'); 
		    C=ge(iX,iY);
         end 
		 
         function interval=convertToInterval(obj,name)
            if nargin==1 % 
              name='test';
            end
            
            variables=symvar(obj.form);
            var_size=length(variables);
            Upp=obj.form; Down=obj.form;
            for i=1:var_size
                Upp=subs(Upp,variables(i), 1);
                Down=subs(Down,variables(i), -1);
            end
			interval=Interval(double(Down),double(Upp), name);
         end
        
		
		function aff=prepareAffine(value)
			 val_class=class(value);
             if strcmp(val_class,'Interval')
                aff=AffineForm(value);
                return
             end
             if strcmp(val_class,'double')
				aff=AffineForm(value);
                return
             end
		end
        
    end
    
end

